/** * @description: * @author chenshiqiang E-mail:csqwyyx@163.com * @date 2014年5月1日 下午10:53:20 * @version 1.0 */ package com.csq.thesceneryalong.utils.dbmodel; import java.io.File; import java.io.FileInputStream; import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.io.Writer; import java.util.ArrayList; import java.util.List; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.io.OutputFormat; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; import org.zeroturnaround.zip.ZipUtil; import android.text.TextUtils; import com.csq.thesceneryalong.constant.PathConstants; import com.csq.thesceneryalong.db.Scenery; import com.csq.thesceneryalong.db.Track; import com.csq.thesceneryalong.db.TrackPoint; import com.csq.thesceneryalong.io.db.SceneryDb; import com.csq.thesceneryalong.io.db.TrackDb; import com.csq.thesceneryalong.io.db.TrackPointDb; import com.csq.thesceneryalong.models.models.RecordStatus; import com.csq.thesceneryalong.utils.DateUtils; import com.csq.thesceneryalong.utils.DeviceUtil; import com.csq.thesceneryalong.utils.Dom4jUtil; import com.csq.thesceneryalong.utils.StringUtils; public class TrackUtil { public static final String NODE_TRACK = "Track"; public static final String NODE_TRACK_UNIQUEMACK = "uniqueMack"; public static final String NODE_TRACK_VERSION = "version"; public static final String NODE_TRACK_NAME = "name"; public static final String NODE_TRACK_DESCRIPTION = "description"; public static final String NODE_TRACK_BEGINTIME = "beginTime"; public static final String NODE_TRACK_ENDTIME = "endTime"; public static final String NODE_TRACK_POINTSNUM = "pointsNum"; public static final String NODE_TRACK_FIRSTPOINTTIME = "firstPointTime"; public static final String NODE_TRACK_LASTPOINTTIME = "lastPointTime"; public static final String NODE_TRACK_MOVINGTIME = "movingTime"; public static final String NODE_TRACK_MOVINGDISTANCE = "movingDistance"; public static final String NODE_TRACK_SCENERYNUM = "sceneryNum"; public static final String NODE_TRACK_RECORDSTATUS = "recordStatus"; public static final String NODE_TRACK_TRACKPOINTS = "trackPoints"; public static final String NODE_TRACK_SCENERYS = "scenerys"; /** * @description: 创建一个正在记录的轨迹 * @author: chenshiqiang E-mail:csqwyyx@163.com * @return */ public static Track newRecordingTrack(){ Track track = new Track(); long curTime = System.currentTimeMillis(); track.setBeginTime(curTime); track.setDescription(""); track.setEndTime(curTime); track.setFirstPointTime(curTime); track.setLastPointTime(curTime); track.setMovingDistance(0.0); track.setMovingTime(0l); track.setName(DateUtils.getFormatedDateYMDHM(curTime)); track.setPointsNum(0); track.setRecordStatus(RecordStatus.recording.getValue()); track.setSceneryNum(0); track.setUniqueMack(DeviceUtil.getTrackUniqueMark()); track.setVersion(0); return track; } /** * @description: 获得列表日期分隔标识yyyy-MM-dd * @author: chenshiqiang E-mail:csqwyyx@163.com * @param track * @return */ public static String getListSelection(Track track){ return DateUtils.getFormatedDateYMD(track.getBeginTime()); } /** * @description: 获得xml保存路径,在轨迹目录/xml/v1.xml * @author: chenshiqiang E-mail:csqwyyx@163.com * @param track * @return */ public static String getTrackXmlPath(Track track){ return getTrackXmlPath(track.getUniqueMack()); } public static String getTrackXmlPath(String uniqueMack){ String path = PathConstants.getTrackpath() + File.separator + uniqueMack + File.separator + "xml"; File f = new File(path); if(!f.exists()){ f.mkdirs(); } return path + File.separator + uniqueMack + ".xml"; } /** * @description: 获取轨迹路径 * @author: chenshiqiang E-mail:csqwyyx@163.com * @param track * @return */ public static String getTrackPath(Track track){ String path = PathConstants.getTrackpath() + File.separator + track.getUniqueMack(); File f = new File(path); if(!f.exists()){ f.mkdirs(); } return path; } /** * @description: 生成xml文件,路径getTrackXmlPath(Track track)即轨迹目录/xml/v1.xml * @author: chenshiqiang E-mail:csqwyyx@163.com * @param track * @return */ public static String createXml(Track track){ try { //DocumentHelper提供了创建Document对象的方法 Document document = DocumentHelper.createDocument(); document.setXMLEncoding("UTF-8"); //1.添加Track节点 Element trackElement = document.addElement(NODE_TRACK); //1.1 uniqueMack Element uniqueMack = trackElement.addElement(NODE_TRACK_UNIQUEMACK); uniqueMack.setText(StringUtils.avoidNull(track.getUniqueMack(), "")); //1.2 version Element version = trackElement.addElement(NODE_TRACK_VERSION); version.setText(StringUtils.avoidNull(track.getVersion(), "")); //1.3 name Element name = trackElement.addElement(NODE_TRACK_NAME); name.setText(StringUtils.avoidNull(track.getName(), "")); //1.4 description Element description = trackElement.addElement(NODE_TRACK_DESCRIPTION); description.setText(StringUtils.avoidNull(track.getDescription(), "")); //1.5 beginTime Element beginTime = trackElement.addElement(NODE_TRACK_BEGINTIME); beginTime.setText(StringUtils.avoidNull(track.getBeginTime(), "")); //1.6 endTime Element endTime = trackElement.addElement(NODE_TRACK_ENDTIME); endTime.setText(StringUtils.avoidNull(track.getEndTime(), "")); //1.7 pointsNum Element pointsNum = trackElement.addElement(NODE_TRACK_POINTSNUM); pointsNum.setText(StringUtils.avoidNull(track.getPointsNum(), "")); //1.8 firstPointTime Element firstPointTime = trackElement.addElement(NODE_TRACK_FIRSTPOINTTIME); firstPointTime.setText(StringUtils.avoidNull(track.getFirstPointTime(), "")); //1.9 lastPointTime Element lastPointTime = trackElement.addElement(NODE_TRACK_LASTPOINTTIME); lastPointTime.setText(StringUtils.avoidNull(track.getLastPointTime(), "")); //1.10 movingTime Element movingTime = trackElement.addElement(NODE_TRACK_MOVINGTIME); movingTime.setText(StringUtils.avoidNull(track.getMovingTime(), "")); //1.11 movingDistance Element movingDistance = trackElement.addElement(NODE_TRACK_MOVINGDISTANCE); movingDistance.setText(StringUtils.avoidNull(track.getMovingDistance(), "")); //1.12 sceneryNum Element sceneryNum = trackElement.addElement(NODE_TRACK_SCENERYNUM); sceneryNum.setText(StringUtils.avoidNull(track.getSceneryNum(), "")); //1.13 recordStatus Element recordStatus = trackElement.addElement(NODE_TRACK_RECORDSTATUS); recordStatus.setText(StringUtils.avoidNull(track.getRecordStatus(), "")); //1.14 trackPoints Element trackPoints = trackElement.addElement(NODE_TRACK_TRACKPOINTS); List<TrackPoint> tps = track.getTrackPoints(); track.resetTrackPoints(); if(tps != null && !tps.isEmpty()){ for(TrackPoint point : tps){ TrackPointUtil.createXml(trackPoints, point); } } //1.15 Scenery Element scenerys = trackElement.addElement(NODE_TRACK_SCENERYS); List<Scenery> ss = track.getScenerys(); track.resetScenerys(); if(ss != null && !ss.isEmpty()){ for(Scenery point : ss){ SceneryUtil.createXml(scenerys, point); } } String xmlPath = getTrackXmlPath(track); Writer fileWriter = new FileWriter(xmlPath); //换行 OutputFormat format = new OutputFormat(); format.setEncoding("UTF-8"); format.setNewlines(true); //dom4j提供了专门写入文件的对象XMLWriter XMLWriter xmlWriter = new XMLWriter(fileWriter, format); xmlWriter.write(document); xmlWriter.flush(); xmlWriter.close(); return xmlPath; } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } return null; } /** * @description: 解析xml文件,生成轨迹,并保存到数据库 * @author: chenshiqiang E-mail:csqwyyx@163.com * @param xmlPath * @return */ public static Track parseXmlAndSave(String xmlPath) { try { // 将src下面的xml转换为输入流 InputStream inputStream = new FileInputStream(xmlPath); // 创建SAXReader读取器,专门用于读取xml SAXReader saxReader = new SAXReader(); // 根据saxReader的read重写方法可知,既可以通过inputStream输入流来读取,也可以通过file对象来读取 Document document = saxReader.read(inputStream); Track track = new Track(); Element trackElement = document.getRootElement(); track.setUniqueMack(Dom4jUtil.parseString(trackElement, NODE_TRACK_UNIQUEMACK, "")); track.setVersion(Dom4jUtil.parseInterger(trackElement, NODE_TRACK_VERSION, 0)); track.setName(Dom4jUtil.parseString(trackElement, NODE_TRACK_NAME, "")); track.setDescription(Dom4jUtil.parseString(trackElement, NODE_TRACK_DESCRIPTION, "")); track.setBeginTime(Dom4jUtil.parseLong(trackElement, NODE_TRACK_BEGINTIME, 0)); track.setEndTime(Dom4jUtil.parseLong(trackElement, NODE_TRACK_ENDTIME, 0)); track.setFirstPointTime(Dom4jUtil.parseLong(trackElement, NODE_TRACK_FIRSTPOINTTIME, 0)); track.setLastPointTime(Dom4jUtil.parseLong(trackElement, NODE_TRACK_LASTPOINTTIME, 0)); track.setMovingTime(Dom4jUtil.parseLong(trackElement, NODE_TRACK_MOVINGTIME, 0)); track.setMovingDistance(Dom4jUtil.parseDouble(trackElement, NODE_TRACK_MOVINGDISTANCE, 0)); track.setRecordStatus(Dom4jUtil.parseInterger(trackElement, NODE_TRACK_RECORDSTATUS, 0)); List<TrackPoint> tps = TrackPointUtil.parseXml( trackElement.element(NODE_TRACK_TRACKPOINTS)); track.setPointsNum(tps.size()); //轨迹点以解析到的为准 List<Scenery> ss = SceneryUtil.parseXml( trackElement.element(NODE_TRACK_SCENERYS)); track.setSceneryNum(ss.size()); //风景数以解析到的为准 //保存轨迹 long trackId = TrackDb.getInstance().add(track); if(trackId < 1){ //轨迹保存失败,返回 return null; } track.setId(trackId); //保存轨迹点 if(!tps.isEmpty()){ for(TrackPoint tp : tps){ tp.setTrackId(trackId); } TrackPointDb.getInstance().addSome(tps); } //保存风景 if(!ss.isEmpty()){ for(Scenery s : ss){ s.setTrackId(trackId); } SceneryDb.getInstance().addSome(ss); } return track; } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } /** * @description: 压缩并返回zip路径 * @author: chenshiqiang E-mail:csqwyyx@163.com * @param track * @return */ public static String zipPack(Track track){ if(createXml(track) != null){ String trackPath = PathConstants.getTrackpath() + File.separator + track.getUniqueMack(); String zipPath = PathConstants.getExportpath() + File.separator + StringUtils.filterIllegalWords(track.getName()) + ".tsa"; ZipUtil.pack(new File(trackPath), new File(zipPath), true); return zipPath; } return null; } /** * @description: 获取需要导入的轨迹文件列表 * @author: chenshiqiang E-mail:csqwyyx@163.com * @return */ public static List<String> getImportTasFiles(){ List<String> tsas = new ArrayList<String>(); File root = new File(PathConstants.getImportpath()); if(root.exists()){ File[] fs = root.listFiles(); if(fs != null && fs.length > 0){ for(File f : fs){ if(f.isFile() && f.getName().endsWith(".tsa")){ tsas.add(f.getAbsolutePath()); } } } } return tsas; } /** * @description: 导入一条轨迹 * @author: chenshiqiang E-mail:csqwyyx@163.com * @param zipPath * @return */ public static Track importATrack(String tsaPath){ //先获取轨迹唯一标识 String uniqueMack = getUniqueMackFromZip(tsaPath); if(!TextUtils.isEmpty(uniqueMack)){ Track track = TrackDb.getInstance().queryByUniqueMack(uniqueMack); if(track != null){ //导入的轨迹已存在 //导入成功,删除tsa文件 new File(tsaPath).delete(); return track; }else{ //不存在,先解压,再解析保存到数据库 //解压 ZipUtil.unpack(new File(tsaPath), new File(PathConstants.getTrackpath())); //解析并保存轨迹到数据库 String xmlPath = getTrackXmlPath(uniqueMack); track = parseXmlAndSave(xmlPath); if(track != null){ //导入成功,删除tsa文件 new File(tsaPath).delete(); } return track; } } return null; } /** * @description: 从zip文件获取轨迹唯一标识 * @author: chenshiqiang E-mail:csqwyyx@163.com * @param zipPath * @return */ public static String getUniqueMackFromZip(String zipPath){ String uniqueMack = null; ZipInputStream inZip = null; try { inZip = new ZipInputStream(new java.io.FileInputStream(zipPath)); ZipEntry zipEntry; String entryName; while ((zipEntry = inZip.getNextEntry()) != null) { entryName = zipEntry.getName(); if (zipEntry.isDirectory() && entryName.contains(File.separator + "xml")) { uniqueMack = entryName.substring(0, entryName.indexOf(File.separator + "xml")); break; } } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { if(inZip != null){ try { inZip.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } return uniqueMack; } }